ledger 使用流程

Ledger CLI 是一个功能强大的命令行双式记账工具,用于管理个人或企业财务。

1. 复式记账的基本原理

  • 账户结构:五大类,通常设置3个层级即可。 费用(Expenses) + 资产(Assets)= 所有者权益(Equity)+ 负债(Liabilities)+ 收入( Income )
  • 复式记账:每笔交易涉及借方和贷方,总和为零。 首先要理解什么是会计衡等式。这里面还有个较难理解的概念是借记贷记(借贷),英文中的 debit 和 credit 。

The destination account is debited; The source account for the transaction is credited.

An account is anywhere money can go.

There must always be a debit from at least one account for every credit made to another account.

为什么要贷(Debit)给你?因为你有信用(Credit)啊!

  1. 收付实现制权责发生制

举个简单的例子说明二者的含义。拿交房租来说,年初你交了未来半年的房租 12000 CNY,收付实现制会这么记账,年初支出 12000 CNY,只有这 1 笔。权责发生制会这么记,未来的 6 个月,每月支出 2000 CNY,共 6 笔。 个人采用的是前者,即收付实现制,主要优点是方便对账,毕竟银行的流水只有 1 笔 12000 CNY 的。他的缺点也很明显,会导致月度财务报表并不准确,不能清晰反应月度收支情况。所以采用收付实现制,在查看报表的时候,不应简单的去看数字的绝对值。

  1. 负支出

电商购物退款退货的场景很常见,月初买了一个东西,记了一笔支出,到货后发现不合适申请退货,中旬退款回到原支付渠道。我该怎么记这笔退款呢?省事的办法是把月初记的支出那笔删除,还有一个办法是退款导致时记一笔收入。但是聪明的你一定会发现这两种方法都不太理想,前者不能反应真实流水,后者会导致月度报表支出与收入都虚高。 比较合理的做法是退款时记录一笔负支出。当你意识到支出可以是负的时候,很多帐目记起来就简单多了。

2. Ledger 语法知识

  • 文本文件:使用 `.ledger` 文件存储交易。在 Emacs 中可以在文件的头部增加 ~;; -- mode: ledger --~,Emacs 会自动使用 ledger-mode。

终端安装 ledger

brew install ledger

常用命令有余额查询、交易明细记录、预算管理等。

  • 余额查询:

    ledger -f main.txt balance
    
  • 交易明细:

    ledger -f main.txt register Expenses
    
  • 预算管理:

    ledger -f main.txt budget
    

2.1. Ledger 命令行的可选参数有哪些?

2.1.1. 全局选项

  • -f FILE: 指定 Ledger 文件。
  • --verbose: 显示详细日志。
  • --version: 显示版本。

2.1.2. 时间范围选项

  • -b DATE: 开始日期。

    ledger -f main.txt -b "2025/04/01" register
    
  • -p PERIOD: 时间周期。

    ledger -f main.txt -p "2025/04" balance
    
  • --monthly: 按月汇总。

2.1.3. 报表过滤选项

  • -c: 仅已清算交易。
  • -l EXPR: 表达式过滤。

    ledger -f main.txt -l "amount > 100" register
    

2.1.4. 输出格式选项

  • --format FMT: 自定义格式。

    ledger -f main.txt --format "%(date),%(payee),%(amount)\n" register > report.csv
    
  • --json: 输出 JSON。

2.1.5. 货币和资产选项

  • -X CURRENCY: 转换为指定货币。
  • -V: 按市场价值计算。

3. 经济学角度,财务报告应查看哪些方面?

3.1. 资产与负债:高净资产表明财务缓冲能力。

ledger -f main.txt balance ^Assets ^Liabilities

3.2. 收入与支出:正现金流支持资源积累

查看损益:

ledger -f main.txt balance ^Income ^Expenses

3.3. 预算偏差:偏差反映财务纪律

ledger -f main.txt budget

3.4. 投资回报:高回报率表明资源配置效率

ledger -f main.txt balance Assets:Investment -X CNY

3.5. 风险与可持续性:低流动性增加经济脆弱性

ledger -f main.txt balance Assets:Bank

4. Ledger 记录基金和股票

通过记录份额和当前的单价即可计算当前基金的价值是多少。

Assets:Investment:Funds:110003            98.12 FUND @ 1.8321 CNY
P 2025-04-16 FUND 1.7864 CNY
ledger -f main.txt bal ^Assets:Inv -X CNY --gain

5. 报告怎么排除某个账户?

register 报表中排除账户使用 and not 。如果只查某个账户可以使用 --limit

ledger -f main.txt reg ^Expenses and not Expenses:Food

6. 记账的步骤

我采取的策略是消费的的同时记录这笔交易,一次操作的时间成本可能就十几二十秒。相比于一个月整理一次的时间成本和心智成本都相对较小。以我过往记账的经验,即使使用导出的账单自动分析处理生成账本同样需要消耗很多的时间,一个月操作一次对账需要半个小时至一个小时的时间。

我通常在手机端使用自己编辑的 Shortcuts 快捷应用和 cone 这款编辑器来进行。每月查看一次报表并核对资产和信用账单。采用编辑的 Python 脚本生成当月的报表图进行查看。

我的 ledger 配置如下:

(use-package ledger-mode
  :load-path "packages/ledger-mode/"
  :mode ("\\.ledger\\'" . ledger-mode)
  :config
  (setq ledger-accounts-file "~/Finance/main.txt")
  (setq ledger-reports '(("1-资产与负债表" "%(binary) -f %(ledger-file) bal ^Assets: ^Liabilities: -X CNY")
                         ("2-收入与支出表" "%(binary) -f %(ledger-file) bal ^Income: ^Expenses:")
                         ("3-预算表(本月)" "%(binary) -f %(ledger-file) budget --period \"this month\"")
                         ("4-投资回报" "%(binary) -f %(ledger-file) bal ^Assets:Investment -X CNY")
                         ("5-现金流动性" "%(binary) -f %(ledger-file) bal ^Assets:Bank")
                         ("6-交易日志(本月)" "%(binary) -f %(ledger-file) reg")
                         ("t1-今日支出总额" "%(binary) -f %(ledger-file) reg ^Expenses: --period today")
                         ("t2-本周支出总额" "%(binary) -f %(ledger-file) reg ^Expenses: --period \"this week\"")
                         ("t3-上周支出总额" "%(binary) -f %(ledger-file) reg ^Expenses: --period \"last week\"")
                         ("account" "%(binary) -f %(ledger-file) reg %(account)")
                         ("bal" "%(binary) -f %(ledger-file) bal")
                         ("reg" "%(binary) -f %(ledger-file) reg")
                         ("payee" "%(binary) -f %(ledger-file) reg @%(payee)"))))

7. 参考资源


Created with Emacs 30.1 (Org mode 9.7.11) on MacOS Updated: 2025-04-23 Wed 21:15